package com.example.demo.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.example.demo.dao.BookMapper;
import com.example.demo.dao.BookShelfMapper;
import com.example.demo.dao.ChapterMapper;
import com.example.demo.dao.HistoryMapper;
import com.example.demo.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 功能描述：
 *
 * @Author: Zhanghf
 * @Date: 2021/5/20 10:14
 */
@RequestMapping("shelf")
@Controller
public class ShelfController {
    @Autowired(required = false)
    private BookShelfMapper bookShelfMapper;
    @Autowired(required = false)
    private BookMapper bookMapper;
    @Autowired(required = false)
    private HistoryMapper historyMapper;
//    @Autowired(required = false)
//    private ChaptersService chaptersService;
    @Autowired(required = false)
    private ChapterMapper chapterMapper;
//    @Autowired(required = false)
//    private RedisService redisService;
    @RequestMapping(value = "toshelf",method = {RequestMethod.POST})
    public String toshelf(HttpServletResponse response, HttpServletRequest request, Model model,HttpSession session) {
        //其实可以不设置userid的请求参数的，有机会把它删掉
//        Integer userid =  Integer.parseInt(request.getParameter("userid"));
//        System.out.println(userid);

        /*Integer userid = Integer.parseInt(request.getParameter("userid"));
        * 报空指针的原因
        * 从请求中获取不到 参数userid
        * 因为 request.setAttribute不是设置请求参数的
        * request作为域对象
        request是域对象！在JavaWeb中一共四个域对象，其中ServletContext就是域对象，它在整个应用中只创建一个ServletContext对象。
        * request对象也是其中的一个域对象，request可以在一个请求（包含请求转发）中共享数据。一个请求会创建一个request对象，
        * 如果在一个请求中经历了多个Servlet，那么多个Servlet就可以使用request来共享数据。
        * */
        ArrayList<Book> books = new ArrayList<>();
        User user = (User) session.getAttribute("user");
        model.addAttribute("user",user);
        List<BookShelf> bookShelves = bookShelfMapper.selectList(new QueryWrapper<BookShelf>().eq("userid", user.getId()));
        HashMap<Integer, Chapter> map = new HashMap<>();
        for (BookShelf bookShelf : bookShelves) {
            Integer bookid = bookShelf.getBookid();
            Book book = bookMapper.selectOne(new QueryWrapper<Book>().eq("id", bookid));
            History history = historyMapper.selectOne(new QueryWrapper<History>().eq("userid", user.getId()).eq("bookid", bookid));
                   if(history!=null)
                   {
                  //     map.put(bookid,chaptersService.selectOne(bookid,history.getChapterid()) );
                       map.put(bookid,chapterMapper.selectOne(new QueryWrapper<Chapter>().eq("bookid",bookid).eq("chapterid",history.getChapterid())) );

                   }
            books.add(book);
        }
        model.addAttribute("map",map);
        model.addAttribute("userid", user.getId());
        model.addAttribute("books", books);
        return "myshelf";
    }

    @PostMapping("delete")
    public void delete(HttpServletResponse response, HttpServletRequest request, Model model)
    {
        Integer bookid = Integer.parseInt(request.getParameter("bookid"));
        Integer userid = Integer.parseInt(request.getParameter("userid"));

        bookShelfMapper.delete(new QueryWrapper<BookShelf>().eq("bookid",bookid).eq("userid",userid));
        //redisService.redisDeleteCollections(bookid);
        bookMapper.update(null,new UpdateWrapper<Book>().set("collections",
                bookMapper.selectById(bookid).getCollections()-1
        ));
        response.setStatus(307);
        response.setHeader("location", "toshelf");
        //问题
        //add和delete中
        //把userid,bookid放在url地址上作为请求参数，重定向到toshelf后就丢失了
        //放在隐藏域中，重定向之后依然存在，没有丢失
        //不知道原因，重定向后请求中的数据不应该丢失了吗?
    }

    @PostMapping(value = "add")
    public void add(HttpServletResponse response, HttpServletRequest request, Model model, HttpSession session) throws IOException {
        User user = (User) session.getAttribute("user");
        Integer bookid = Integer.parseInt(request.getParameter("bookid"));
        if (bookShelfMapper.selectOne(new QueryWrapper<BookShelf>().eq("userid", user.getId()).eq("bookid", bookid)) ==
                null) {
            bookShelfMapper.insert(new BookShelf(user.getId(), bookid));
          //  redisService.redisAddCollections(bookid);
//            收藏量+1
            bookMapper.update(null,new UpdateWrapper<Book>().set("collections",
                    bookMapper.selectById(bookid).getCollections()+1
                    ));
        }
        response.setStatus(307);
        response.setHeader("location", "toshelf");

/*
重定向默认发起的请求为Get请求，如何让重定向发起post请求。
解决：
使用SpringBoot提供的return "redirect:***"进行重定向，没有找到方法来让重定向发起Post请求
转而关注Servlet相关的。
使用response.sendRedirect("****");方法可以实现重定向
但发起的请求仍然是Get请求。
原因：
如果第一个请求为Post请求时，现在很多浏览器会在第二个请求中转换为Get请求，
这种处理方式并没有严格遵守HTTP协议。HTTP协议对重定向的状态码作了细分，增加了303（第二个请求转换为Get请求）和307码（第二个请求和第一个请求方法相同）。
https://www.cnblogs.com/ycpanda/p/3637163.html

知道了后,代码写成了
  response.setStatus(307);
  response.sendRedirect("toshelf");
  但仍没效果
原因：
实现重定向
方法一、设置响应状态码，然后利用setHeader("location", "想要跳转的地址")方法实现重定向。
方法二、直接利用sendRedirect()方法实现重定向，这种方法简单，无需设置响应状态码。
所以设置状态码后应该继续设置响应头，就能实现重定向，调用sendRedirect()直接就进行了重定向，请求的方法还是Get。
  https://blog.csdn.net/qq_36761831/article/details/85762001
 */
    }
}
